package grad.nxu.recruitsystem.util;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONException;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.signers.JWTSigner;
import cn.hutool.jwt.signers.JWTSignerUtil;

/**
 * @Author: HAPPY
 * @Project_name: recruitSystem
 * @Package_name: grad.nxu.recruitsystem.util
 * @Date: 2023/3/9 23:17
 * @Description: token 的工具类
 */
public class JWTUtil {

    final static String key = "6MNSobBRCHGIO0fS6MNSobBRCHGIO0fS";
    final static JWTSigner signer = JWTSignerUtil.hs256(key.getBytes());

    /**
     * 获取token
     *
     * @param userId 用户id
     * @param name   用户名称
     * @param email  用户邮箱
     * @param role   用户角色
     * @return token值
     */
    public static String getToken(Integer userId, String name, String email, Integer role) {
        DateTime now = DateUtil.date();

        return JWT.create()
                .setPayload("userId", userId)
                .setPayload("name", name)
                .setPayload("email", email)
                .setPayload("role", role)
                .setIssuedAt(now) // 签发时间
                .setSigner(signer)
                .sign();
    }

    /**
     * 验证token
     *
     * @param token token字符串
     * @return 验证结果
     */
    public static boolean validateToken(String token) {
        boolean res;
        try {
            res = JWT.of(token).setKey(key.getBytes()).validate(0);
        } catch (JSONException jsonException) {
            res = false;
        }
        return res;
    }

    /**
     * 解析token单项内容
     *
     * @param token       token值
     * @param payloadName 属性名
     * @return 返回属性值
     */
    public static Object getPayload(String token, String payloadName) {
        JWT jwt = JWT.of(token);
        jwt.getPayload("");
        return jwt.getPayload(payloadName);
    }

    /**
     * 刷新token过期时间
     *
     * @param token 旧的token
     * @return 新的token
     */
    public static String restTokenExpires(String token) {
        DateTime now = DateUtil.date();
        JWT jwt = JWT.of(token);
        DateTime newExpires = DateUtil.date().setField(DateField.HOUR_OF_DAY, now.getField(DateField.HOUR_OF_DAY) + 2);
        jwt.setExpiresAt(newExpires);
        return jwt.sign();
    }

    /**
     * 验证token是否将要过期 剩余时间小于30分钟即为将要过期
     *
     * @param token token作业
     * @return 返回是否将要过期
     */
    public static boolean isWillExpires(String token) {
        JWT jwt = JWT.of(token);
        long expires = Long.parseLong(jwt.getPayload(JWT.EXPIRES_AT) + "000");
        long timeRemaining = (new DateTime().getTime() - expires) / 1000 / 60;
        if (timeRemaining < 30) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 刷新token
     *
     * @param token 旧的token
     * @return 新的token，也有可能不变
     */
    public static String refreshToken(String token) {
        if (isWillExpires(token)) {
            return restTokenExpires(token);
        } else {
            return token;
        }
    }
}
